package com.xunmeng.chapter1;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.StandardCharsets;

import static com.xunmeng.chapter1.ByteBufferUtil.debugAll;

/**
 * 练习：
 * 网络上有多条数据发送给服务端，数据之间使用 \n 进行分隔 但由于某种原因这些数据在接收时，被进行了重新组合，例如原始数据有3条为
 * Hello,world\n
 * I'm zhangsan\n
 * How are you?\n
 * 变成了下面的两个 byteBuffer (黏包，半包)
 * Hello,world\nI'm zhangsan\nHo
 * w are you?\n
 * 现在要求你编写程序，将错乱的数据恢复成原始的按 \n 分隔的数据
 */
public class TestByteBufferExam {
    public static void main(String[] args) {
        ByteBuffer source = ByteBuffer.allocate(32);
        source.put("Hello,world\nI'm zhangsan\nHo".getBytes());
        split(source);
        source.put("w are you?\nhaha!\n".getBytes());
        split(source);
    }

    private static void split(ByteBuffer source) {
        source.flip();
        for(int i=0;i<source.limit();i++){
            // 从头开始读指导读到换行符为止
            if (source.get(i)=='\n'){
                int length=i+1-source.position();
                // 把这条消息放入新的Buffer
                ByteBuffer target = ByteBuffer.allocate(length);
                // 从source读，从target写
                for(int j=0;j<length;j++){
                    target.put(source.get());
                }
                debugAll(target);
                System.out.println("********************************************");
                debugAll(source);
            }
        }
        source.compact();
    }

//    private static void split(ByteBuffer source) {
//        // 将sourc切入到读模式
//        source.flip();
//        CharBuffer decode = StandardCharsets.UTF_8.decode(source);
//        System.out.printf(decode.toString());
//        // 再次将source切换到写模式
//        source.compact();
//    }


}
